package epoch.db.interfaces;

import java.io.IOException;
import java.util.List;

import epoch.db.config.DBConfig;
import epoch.db.gamedb.Entity;
import epoch.db.gamedb.Record;

/**
 * 数据库服务接口
 * @author will
 * @date 2016年3月23日 下午2:35:31
 */
public interface IDataAccess {

	/**
	 * 初始化
	 * @param configPath
	 */
	void init(DBConfig config) throws IOException;
	
	/**
	 * 新增数据
	 * @param entity
	 */
	<T extends Entity> int insert(T entity);
	
	/**
	 * 批量新增数据
	 * 
	 * @param list
	 * @return
	 */
	<T extends Entity> int[] insert(List<T> list);
	
	/**
	 * 更新数据
	 * @param entity
	 */
	<T extends Entity> boolean update(T entity);
	
	/**
	 * 批量更新数据
	 * 
	 * @param list
	 * @return
	 */
	<T extends Entity> int[] update(List<T> list);
	
	/**
	 * 添加或更新
	 * @param entity
	 * @return
	 */
	<T extends Entity> boolean saveOrUpdate(T entity);

	/**
	 * 删除数据[同步]
	 * @param entity
	 */
	boolean delete(String tableName, Object entityId);
	
	/**
	 * 删除数据[同步]
	 * @param entity
	 */
	<K> boolean deleteList(String tableName, List<K> entityIds);
		
	
	/**
	 * 清空表数据[同步]
	 * @param entity
	 * @return 成功删除的记录数
	 */
	int deleteAll(String tableName);
	
	/**
	 * 根据主键查询
	 * @param entityClass
	 * @param entityId
	 * @return
	 */
	<T extends Entity> T findById(String tableName, Object entityId);
	
	/**
	 * 根据主键查询
	 * @param entityClass
	 * @param entityId
	 * @return
	 */
	<T extends Entity> T findById(String tableName, String[] columns, Object entityId);
	
	/**
	 * 查询
	 * @param queryCommand
	 * @return 返回查询结果
	 * @throws Exception 
	 */
	<T extends Entity> List<T> find(String tableName, String condition, Object... param);
	
	/**
	 * 按列查询
	 * @param tableName
	 * @param columns
	 * @param condition
	 * @param params
	 * @return
	 */
	<T extends Entity> List<T> find(String tableName, String[] columns, String condition, Object[] params);
	
	/**
	 * 查询满足条件的第一条记录
	 * @param tableName
	 * @param condition
	 * @param param
	 * @return
	 */
	<T extends Entity> T findFirst(String tableName, String condition, Object... param);
	
	/**
	 * 查询满足条件的第一条记录
	 * @param tableName
	 * @param columns
	 * @param condition
	 * @param param
	 * @return
	 */
	<T extends Entity> T findFirst(String tableName, String[] columns, String condition, Object... param);
	
	/**
	 * 执行sql命令
	 * @param executeCommand
	 * @return 返回受影响的行数
	 */
	int update(String tableName, String updateCommand, Object... param);
	
	/**
	 * 查询某个表的记录数
	 * @param tableName
	 * @param condition
	 * @param params
	 * @return
	 */
	int queryCount(String tableName, String condition, Object... params);
	
	/**
	 * 跨表自由查询
	 * @param queryCommand
	 * @param param
	 * @return
	 */
	List<Record> freeQuery(String queryCommand, Object... param);
	
	/**
	 * 跨表执行sql命令
	 * @param executeCommand
	 * @return 返回受影响的行数
	 */
	int execute(String executeCommand, Object... param);
	
	/**
	 * 执行sql命令
	 * 
	 * @param executeCommand
	 * @return 返回受影响的行数
	 */
	int execute(String tableName, String executeCommand, Object... params);

}
